package queue;

import java.util.Collection;
import java.util.Iterator;
import java.util.NoSuchElementException;
import java.util.Queue;

import list.MinhaLinkedList;

public class MinhaFila<T> implements Queue<T>{
	private MinhaLinkedList<T> lista;

	public MinhaFila() {
		lista = new MinhaLinkedList<T>();
	}

	@Override
	public boolean add(T elemento) {
		return lista.add(elemento);
	}

	// Devolve e não remove
	@Override
	public T peek() {
		if (lista.size() > 0) {
			return lista.get(0);
		}

		return null;
	}

	// Devolve e remove
	@Override
	public T poll() {
		T retorno = peek();

		if (retorno != null) {
			lista.remove(0);
		}

		return retorno;
	}

	@Override
	public int size() {
		return lista.size();
	}

	@Override
	public boolean isEmpty() {
		return lista.isEmpty();
	}

	@Override
	public boolean contains(Object o) {
		return lista.contains(o);
	}

	@Override
	public Iterator<T> iterator() {
		return lista.iterator();
	}

	@Override
	public Object[] toArray() {
		return lista.toArray();
	}

	@Override
	public <T> T[] toArray(T[] a) {
		return lista.toArray(a);
	}

	@Override
	public boolean remove(Object o) {
		return lista.remove(o);
	}

	@Override
	public boolean containsAll(Collection<?> c) {
		return lista.containsAll(c);
	}

	@Override
	public boolean addAll(Collection<? extends T> c) {
		return lista.addAll(c);
	}

	@Override
	public boolean removeAll(Collection<?> c) {
		return lista.removeAll(c);
	}

	@Override
	public boolean retainAll(Collection<?> c) {
		return lista.retainAll(c);
	}

	@Override
	public void clear() {
		lista.clear();
		
	}

	@Override
	public boolean offer(T e) {
		return add(e);
	}

	@Override
	public T remove() {
		if (lista.isEmpty()) {
			throw new NoSuchElementException();
		}
		return poll();
	}

	@Override
	public T element() {
		if (lista.isEmpty()) {
			throw new NoSuchElementException();
		}
		
		return peek();
	}
}
